# conding = utf-8
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait


class Page:
    """
    所有页面都会继承的类，里面封装了页面的所有操作
    """

    def __init__(self, driver: WebDriver):
        self.driver = driver

    def find_element(self, args):
        """
        :param args: 是两个参数，第一个是定位方式，第二个是定位元素的位置
        :return: 返回定位元素
        """
        return self.driver.find_element(*args)

    def is_exists(self, args):
        """
        判别元素是否存在
        :param args:
        :return:
        """
        eles = self.driver.find_elements(*args)
        if len(eles) > 0:
            return True
        else:
            return False

    def find_element_wait(self, args):
        """
        设置显示等待去获取元素
        :param args: 是两个参数，第一个是定位方式，第二个是定位元素的位置
        :return: 返回定位元素
        """
        return WebDriverWait(self.driver, 30, 0.5) \
            .until(lambda driver: driver.find_element(*args));

    def send_keys(self, args, value):
        """
        元素输入
        :param value:
        :param args:
        :return:
        """
        el = self.find_element(args)  # 查找元素
        el.clear()  # 清空元素
        if "random" in value:
            value = eval(value)
        el.send_keys(value)  # 输入

    def send_file(self, args, value):
        """
        输入文件内容
        :param value:
        :param args:
        :return:
        """
        el = self.find_element(args)  # 查找元素
        el.send_keys(value)  # 输入

    def click(self, args):
        """
        元素单击处理
        :param args:
        :return:
        """
        el = self.find_element(args)
        el.click()

    def text(self, args):
        """
        获取页面元素中的文本内容
        :param args:
        :return:
        """
        el = self.find_element(args)
        return el.text

    def point_text(self, args, value):
        """
        获取页面元素中的文本内容
        :param value:
        :param args:
        :return:
        """
        a, b = args  # 解包
        b = b % value  # 格式化字符串
        c = a, b  # 组合成元组
        el = self.find_element(c)
        return el.text

    def url(self):
        return self.driver.current_url

    def display(self, args):
        """
        元素是否隐藏
        :param args:
        :return:
        """
        el = self.find_element(args)
        return el.is_displayed()
